import { isEmpty } from '@/utils/index';
import { get, isFunction, forEach } from "lodash";
export default {
    /**
    *
    *
    * @param {*} {
    *         requestFun 获取数据的函数，必须返回Promise函数对象
    *         params 获取数据的函数所需的参数
    *         disposeItem 扩展 处理单个数据对象的函数
    *         reader 读取数据相关配置
    *     }
    * @returns 成功回调 resolve({ data, total }); data数据结果集
    *          失败回调 reject({
                   message: '您的网络不佳,请检查您的网络'
               }) message 提示
    */
    readData({
        requestFun, params, reader
    }: any) {
        return new Promise((resolve, reject) => {
            if (!requestFun) {
                // 失败回调
                reject({
                    isNoFun: true
                })
            } else {
                // 通过代理函数获取数据
                requestFun(params).then((res: any) => {
                    // 读取数据相关配置
                    const {
                        // 数据根节点名称
                        rootProperty,
                        // 用于判断请求是否成功的节点名称
                        successProperty } = reader;
                    // 获取请求数据结果状态
                    const success = get(res, successProperty);
                    if (success) {
                        // 获取数据
                        const data = get(res, rootProperty);
                        // 成功回调
                        resolve(data);
                    } else {
                        // 失败回调
                        reject();
                    }
                }).catch(() => {
                    // 失败回调
                    reject()
                });
            }
        });
    },
    // 用于获取固定数据,同一条数据只会发起一次请求,请求后会缓存在store.state中
    // 注意只能在store.action中才能调用
    // 使用例子 store.loadCacheDataByFun(context, 'chargeMan', request.service.get);
    // context store.action 自带参数
    // dataName 数据名称,注意 store.mutation,store.state 的命名都必须一致
    // ajax 请求数据方法
    // params 请求数据参数
    // options 额外配置
    // options.mutationName mutation中处理数据的方法,默认为set
    // options.isReLoad 是否强制重载数据 默认否
    loadCacheDataByFun(context: any, dataName: string, requestFun: any, params?: any,
        {
            mutationName = 'set',
            isReLoad = false,
            disposeItem
        }: any = {}) {
        // //console.log('mutationName:', mutationName, 'isReLoad:', isReLoad);
        // //console.log(context);
        // 从store.state中取出对应数据
        const data = context.state[dataName];
        // 判断store.state中是否已有数据,已有数据则不做任何处理
        if (isEmpty(data) || isReLoad) {
            this.readData({
                requestFun,
                params,
                reader: {
                    rootProperty: "data",
                    successProperty: "success"
                }
            }).then((data: any) => {
                // 如果有遍历单条数据的函数，那么遍历处理数据
                if (isFunction(disposeItem)) {
                    forEach(data, disposeItem);
                }
                // 通过store.mutation在store.state中存储数据
                context.commit(mutationName, {
                    name: dataName,
                    data: data
                });
            }).catch(() => {
                context.commit(mutationName, {
                    name: dataName,
                    data: []
                });
            });
        }
    }
}